package 算法.leetcode.array;

import com.alibaba.fastjson.JSON;
import org.junit.Test;

/**
 * @author lchenglong
 * @date 2020/12/9
 */
public class Decrypt {
    @Test
    public void test() {
        int[] code = new int[]{2,4,9,3};
        int k = 0;
        System.out.println(JSON.toJSONString(decrypt(code,k)));
    }

    /**
     * 你有一个炸弹需要拆除，时间紧迫！你的情报员会给你一个长度为n的循环数组code以及一个密钥k。
     *
     * 为了获得正确的密码，你需要替换掉每一个数字。所有数字会同时被替换。
     *
     * 如果k > 0，将第i个数字用 接下来k个数字之和替换。
     * 如果k < 0，将第i个数字用 之前k个数字之和替换。
     * 如果k == 0，将第i个数字用0替换。
     * 由于code是循环的，code[n-1]下一个元素是code[0]，且code[0]前一个元素是code[n-1]。
     *
     * 给你 循环数组code和整数密钥k，请你返回解密后的结果来拆除炸弹！
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode-cn.com/problems/defuse-the-bomb
     * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
     * @param code
     * @param k
     * @return
     */
    public int[] decrypt(int[] code, int k) {
        int[] result = new int[code.length];
        int n = code.length;
        if (k > 0) {
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < k; j++) {
                    result[i] += code[(i+1+j) % n];
                }
            }
        } else if (k < 0) {
            for (int i = 0; i < n; i++) {
                for (int j = 0; k<j; j--) {
                    result[i] += code[(i-1+j+n) % n];
                }
            }
        }
        return result;
    }
}
